import Dexie from 'dexie';

class Database extends Dexie {
    constructor(dbName) {
        //Dexie.delete(dbName);
        //window.shimIndexedDB.deleteDatabase(dbName);
        let dbType = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
        super(dbName, { indexedDB: dbType });
    }

    init() {
        /**
         * 对于表结构简单改变时，需要更新数据库版本
         * dexie版本号 >= 3.0 : 只需把版本号调大，比如：this.version(1).stores(options); 这个把1改为2即可，数字越来越大就行
         * dexie版本号 < 3.0 : 原来代码保留，然后增加新的版本号代码
         * 如果有删除字段的，请参考：https://dexie.org/docs/Tutorial/Design#database-versioning
         */
        let tables = {
            users: `loginId, user, token, resources,loginTime,miniappurl`,
            contexts: `key, data, date`,
            settings: `key, value`,
            videoLog: `url, userId, datakey, currentTime , lastTime, progress, logTime, isReport,isNotRecord`,
            downloadRecord: `url, userId, filePath, fileSize, filename, downloadDate `,
            videoPlayRecord: `key, url, userId, datakey, currentTime , progress, title, startDate, isReport`,
            modulelog: `++id,moduleId,userId,userName,path,startTime,endTime,skimTime`,
            testTb: `++id, userId, desc`
        };
        this.addStore(tables, 1);

        // 测试新增表
        tables.newTb = `++id, xxx, yyy`;
        this.addStore(tables, 2);

        // 测试新增字段
        tables.newTb = `++id, xxx, yyy, zzz`;
        this.addStore(tables, 3);

        // 测试修改字段名
        tables.newTb = `++id, xxx, yyy, aaa`;
        this.version(4).stores(tables).upgrade(tx => {
            return tx.table("newTb").toCollection().modify(item => {
                item.aaa = '如果有需要可以手动赋值';
                delete item.zzz;
            });
        });

        // 测试删除字段
        tables.newTb = `++id, xxx, aaa`
        this.version(5).stores(tables).upgrade(tx => {
            return tx.table("newTb").toCollection().modify(item => {
                delete item.yyy;
            });
        });

        /**
         * 如果有更新数据库，在tables的基础上修改，
         *  简单的：
         *      比如新增数据库：
         *          tables.newTb = `++id, xxx, yyy`;
         *          this.addStore(tables, 2);   // 后面的2表示版本号，每次更新版本号要越来越大
         *      比如新增表字段：
         *          tables.newTb = `++id, xxx, yyy, zzz`;
         *          this.addStore(tables, 3);
         *
         *  复杂的：
         *      比如修改字段名称：tables.newTb = `++id, xxx, yyy, aaa`
         *      比如删除字段：tables.newTb = `++id, xxx, aaa`
         *      需要手动删除旧字段并给新字段赋值（如果有需要）
         *
         *  修改字段名demo：
         *
            tables.newTb = `++id, xxx, yyy, aaa`;
            this.version(4).stores(tables).upgrade(tx => {
                return tx.table("newTb").toCollection().modify(item => {
                    item.aaa = '如果有需要可以手动赋值';
                    delete item.zzz;
                });
            });

         *
         *  删除demo：
         *
            tables.newTb = `++id, xxx, aaa`;
            this.version(5).stores(tables).upgrade(tx => {
                return tx.table("newTb").toCollection().modify(item => {
                    delete item.yyy;
                });
            });
         */
    }

    get Dexie() {
        return Dexie;
    }

    addStore(options, version) {
        if (this.isOpen()) {
            this.close();
        }

        this.version(version).stores(options);
        //this.open();
    }
}

export default Database;
